public OnPlayerRequestSpawn(playerid) {
	TextDrawHideForPlayer(playerid, textDraw[teamLeft][playerid]);
	TextDrawHideForPlayer(playerid, textDraw[teamMiddle][playerid]);
	TextDrawHideForPlayer(playerid, textDraw[teamRight][playerid]);
	
	if (playerData[playerid][team] == TEAM_HOME || playerData[playerid][team] == TEAM_AWAY) {
		new formattedOutput[128];
		format(formattedOutput, 128, "* %s %s %s. (%s)", nickName(playerid), 
														(playerData[playerid][isAutoAssigned]) ? ("has been auto assigned to") : ("spawned as"),
														(playerData[playerid][team] == TEAM_HOME) ? (gameConfig[homeName]) : (gameConfig[awayName]),
														(playerData[playerid][team] == TEAM_HOME) ? ((teamData[TEAM_HOME][bAttacking]) ? ("Attacking") : ("Defending")) : ((teamData[TEAM_AWAY][bAttacking]) ? ("Attacking") : ("Defending")));
	}
	
	else if (playerData[playerid][team] == TEAM_REF) {
		SendFormattedMessageToAll(C_YELLOW, "* %s spawned as Referee.", CPlayer::getName(playerid));
	}
	
	else if (playerData[playerid][team] == TEAM_HOME_SUB || playerData[playerid][team] == TEAM_AWAY_SUB) {
		new formattedOutput[128];
		format(formattedOutput, 128, "* %s spawned as substitute for team %s. (%s)", nickName(playerid),
																					 (playerData[playerid][team] == TEAM_HOME_SUB) ? (gameConfig[homeName]) : (gameConfig[awayName]),
																					 (playerData[playerid][team] == TEAM_HOME) ? ((teamData[TEAM_HOME][bAttacking]) ? ("Attacking") : ("Defending")) : ((teamData[TEAM_AWAY][bAttacking]) ? ("Attacking") : ("Defending")));
	}
	
	playerData[playerid][classCamMoving] = false;
	CPlayer::crashSafeSkinSync(playerid);
	return true;
}